<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>遍历树类型</title>
</head>
<body>
<script>
    /************************************************JSON生成树对象********************************************************/
    var list = [
        {id: 1, label: "第一级1", parentId: 0, isModel: false},
        {id: 2, label: "第一级2", parentId: 0, isModel: false},
        {id: 3, label: "第一级3", parentId: 0, isModel: false},
        {id: 4, label: "第二级1-1", parentId: 1, isModel: false},
        {id: 5, label: "第二级1-2", parentId: 1, isModel: false},
        {id: 6, label: "第二级1-3", parentId: 1, isModel: true},
        {id: 7, label: "第二级2-1", parentId: 2, isModel: true},
        {id: 8, label: "第三级1-1-1", parentId: 4, isModel: false},
        {id: 9, label: "第三级1-2-1", parentId: 5, isModel: true},
        {id: 10, label: "第三级1-2-2", parentId: 5, isModel: true},
        {id: 11, label: "第三级1-1-1-1", parentId: 8, isModel: true},
    ]

    function ToTree(data) {
        // 删除 所有 children,以防止多次调用
        data.forEach(function (item) {
            delete item.children;
        });

        // 将数据存储为 以 id 为 KEY 的 map 索引数据列
        var map = {};
        data.forEach(function (item) {
            map[item.id] = item;
        });
        // console.log(map);
        var val = [];
        data.forEach(function (item) {
            // 以当前遍历项，的parentId,去map对象中找到索引的id
            var parent = map[item.parentId];
            // 好绕啊，如果找到索引，那么说明此项不在顶级当中,那么需要把此项添加到，他对应的父级中
            if (parent) {
                (parent.children || (parent.children = [])).push(item);
            } else {
                //如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中，作为顶级
                val.push(item);
            }
        });
        return val;
    }

    var tree = this.ToTree(list)
    console.log(tree);
    /************************************************JSON生成树对象********************************************************/

    /************************************************遍历树对象********************************************************/
    var newTree = [];

    //递归遍历树
    function traverseTree(node) {
        if (!node) {
            return;
        }

        if (node.children && node.children.length > 0) {
            newTree.push({id: node.id, label: node.label, parentId: node.parentId})
            for (var i = 0; i < node.children.length; i++) {
                this.traverseTree(node.children[i]);
            }
        }else{
            //当没有子集且不是模板项时也为可选目录
            if (!node.isModel) {
                newTree.push({id: node.id, label: node.label, parentId: node.parentId})
            }
        }
    }

    for (var item of tree) {
        re = traverseTree(item);
    }

    var tree2 = this.ToTree(newTree)
    console.log(tree2);

</script>

</body>
</html>